不使用 Omit 实现 TypeScript 的 Omit<T, K> 泛型
Omit 会创建一个省略 K 中字段的 T 对象
例如:
interface Todo {
title: string
description: string
completed: boolean
}
type TodoPreview = MyOmit<Todo, 'description' | 'title'>
const todo: TodoPreview = {
completed: false,
}
type MyOmit<T, P extends keyof T> = {
[K in keyof T as K extends P ? never: K]: T[K]
}
而不是:
type MyOmit<T, P extends keyof T> = {
[K in Exclude<keyof T, P>]: T[K]
}
这样会导致 readonly 修饰符丢失,通不过以下测试:
interface Todo1 {
readonly title: string
description: string
completed: boolean
}
Expect<Equal<Expected3, MyOmit<Todo1, 'description' | 'completed'>>>